package org.example.java.jvm.error;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * VM Args：-Xms20M -Xmx40M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\Ziyi\AppData\Local\Temp\ -XX:+PrintGCDetails
 * Java Method Stack 内存溢出实验
 * <p/>
 * 堆是用来存储对象的，当然对象不一定都存在堆里（由于逃逸技术的发展）。
 * 那么堆如果溢出了，一定是不能被杀掉的对象太多了。模拟 Heap 内存溢出，只要不断创建对象并保持有引用存在即可。
 * <p/>
 * run result:
 * 81106406
 * java.lang.OutOfMemoryError: Java heap space
 * at jvm.HeapOomErrorTest.main(HeapOomErrorTest.java:32)
 * at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 */
public class HeapOOM {
  static class HeapOomObject {
  }

  public static void main(String[] args) {
    int i = 0, j = 0;
    try {
      List<HeapOomObject> list = new ArrayList<HeapOomObject>();
      while (true) {
        i++;
        list.add(new HeapOomObject());
//        if (list.size() > 1061940) {
//          System.out.println(j++);
//          list = new ArrayList<HeapOomObject>();
//        }
      }
    } finally {
      System.out.println(i);
      try {
        TimeUnit.SECONDS.sleep(60);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }

  }
}